﻿using System.Collections.Generic;
using System.Linq;

namespace AutomatedDecisionMaking.Class.Algorithms
{
    class MaxiMaxAlgorithm
    {
        private readonly DecisionMatrix _mDecisionMatrix;   /// Macierzy decyzji
        private readonly List<double> _mListMaxValue;       /// Lista maksymalnych wartości 
        private readonly List<string> _mStrListMaxValue;    /// Lista maksymalnych wartości
        private double _mMaxiMaxVal;                        /// Wartość odpowiadająca podjętej decyzji
        private string _mDecision;                          /// Podjęta decyzja

        /// <summary>
        /// Konstruktor algorytmu realizującego kryterium MaxiMax.
        /// </summary>
        /// <param name="decisionMatrix">Macierz decyzji wprowadzona porzez użytkownika</param>
        public MaxiMaxAlgorithm(DecisionMatrix decisionMatrix)
        {
            _mStrListMaxValue = new List<string>();
            _mListMaxValue = new List<double>();
            _mDecisionMatrix = decisionMatrix;
        }

        /// <summary>
        /// Uruchomienie algorytmu i rozwiązanie postawionego zadania
        /// </summary>
        public void CalculateSolution()
        {
            //List<double> listMaxValue = new List<double>();
            for (int i = 0; i < _mDecisionMatrix.Value.Count; ++i)
            {
                string element = _mDecisionMatrix.DecisionList.ElementAt(i);
                double maxVal = _mDecisionMatrix.Value[i].Max();
                _mStrListMaxValue.Add(element + " : max = "+ maxVal);
                _mListMaxValue.Add(maxVal);
            }

            _mMaxiMaxVal = _mListMaxValue.Max();
            _mDecision = _mDecisionMatrix.DecisionList.ElementAt(_mListMaxValue.FindIndex(w => w == _mMaxiMaxVal));
        }

        /// <summary>
        /// Podjęta decyzja
        /// </summary>
        /// <returns>Podjęta decyzja</returns>
        public string GetDecision()
        {
            return _mDecision;
        }

        /// <summary>
        /// Dostep do wartości odpowiadającej podjętej decyzji
        /// </summary>
        /// <returns>Najwiksza z największych wartości</returns>
        public double GetMaxiMaxValue()
        {
            return _mMaxiMaxVal;
        }

        /// <summary>
        /// Największe wartości w wierszach
        /// </summary>
        /// <returns>Największe wartości w wierszach</returns>
        public List<string> GetMaxValuesStr()
        {
            return _mStrListMaxValue;
        }

        /// <summary>
        /// Największe wartości w wierszach
        /// </summary>
        /// <returns>Największe wartości w wierszach</returns>
        public List<double> GetMaxValues()
        {
            return _mListMaxValue;
        }
    }
}
